package com.lh.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;

public class HttpPostClient {
    private static final Logger log = LoggerFactory.getLogger(HttpPostClient.class);
    // 超时时间（建议设置，避免无限等待）
    private static final int CONNECT_TIMEOUT = 5000; // 连接超时：5秒
    private static final int READ_TIMEOUT = 10000;    // 读取超时：10秒

    public static String sendPostJson(String requestUrl, String jsonStr) {
        // 1. 初始化连接对象
        HttpURLConnection urlConnection = null;
        OutputStream os = null;
        InputStream is = null;
        BufferedReader br = null;

        try {
            // 2. 创建 URL 并打开连接
            URL url = new URL(requestUrl);
            urlConnection = (HttpURLConnection) url.openConnection();

            // 3. 关键配置（修复核心问题）
            urlConnection.setRequestMethod("POST"); // 显式声明 POST 方法（必须）
            urlConnection.setDoOutput(true);        // 允许写入请求体（POST 必备）
            urlConnection.setDoInput(true);         // 允许读取响应体
            urlConnection.setUseCaches(false);      // 禁用缓存（避免旧数据干扰）
            // 设置超时（防止无响应挂起）
            urlConnection.setConnectTimeout(CONNECT_TIMEOUT);
            urlConnection.setReadTimeout(READ_TIMEOUT);

            // 4. 设置请求头（与 curl 保持一致！）
            urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // 同 curl
            urlConnection.setRequestProperty("Accept", "application/json"); // 新增：与 curl 的 --header 'Accept: application/json' 对应
            // （可选）如果 curl 有其他头（如 User-Agent、Authorization），需在此补充
            // urlConnection.setRequestProperty("User-Agent", "Java-HttpURLConnection");
            // urlConnection.setRequestProperty("Authorization", "Bearer xxx");

            // 5. 写入请求体（JSON 字符串）
            os = urlConnection.getOutputStream();
            os.write(jsonStr.getBytes(StandardCharsets.UTF_8)); // 明确 UTF-8 编码（同 curl）
            os.flush(); // 确保请求体完全发送

            // 6. 处理响应：先判断响应码，再读取对应流（正常流/错误流）
            int responseCode = urlConnection.getResponseCode();

            // 6.1 响应码 200-299：正常响应，读 InputStream
            if (responseCode >= 200 && responseCode < 300) {
                is = urlConnection.getInputStream();
            }
            // 6.2 响应码 400/500 等：错误响应，读 ErrorStream（关键！原代码未处理）
            else {
                is = urlConnection.getErrorStream();
                log.error("请求返回非成功响应码：{}，服务器错误信息流将被读取", responseCode);
            }

            // 7. 读取响应内容（无论正常/错误流，统一处理）
            br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
            String body = br.lines().collect(Collectors.joining(System.lineSeparator()));
            log.info("请求 URL：{}，响应码：{}，响应内容：{}", requestUrl, responseCode, body);

            // 8. 根据响应码返回结果
            if (responseCode >= 200 && responseCode < 300) {
                return body; // 正常返回服务器响应
            } else {
                // 错误响应：返回服务器实际错误信息（而非固定字符串，便于排查）
                return String.format("{\"code\": \"%d\", \"msg\":\"接口异常\", \"serverError\":\"%s\"}", responseCode, body);
            }

        } catch (Exception e) {
            // 9. 异常处理：打印堆栈（关键！原代码无日志，无法定位问题）
            log.error("发送 POST 请求异常！URL：{}，JSON：{}", requestUrl, jsonStr, e);
            return String.format("{\"code\": \"-1\", \"msg\":\"请求异常：%s\"}", e.getMessage());

        } finally {
            // 10. 关闭资源（避免内存泄漏）
            try {
                if (br != null) br.close();
                if (is != null) is.close();
                if (os != null) os.close();
                if (urlConnection != null) urlConnection.disconnect(); // 断开连接
            } catch (Exception e) {
                log.warn("关闭资源异常", e);
            }
        }
    }

    // 测试方法
    public static void main(String[] args) {
        HttpPostClient client = new HttpPostClient();
        String requestUrl = "你的服务器接口URL"; // 替换为实际 URL
        // 替换为 curl 中 -d 后面的 JSON 字符串（确保格式正确）
        String jsonStr = "{\"signAlgo\":\"HmacSHA256\",\"transId\":\"8666655898277902\",\"appId\":\"APP_D82E9FC635FA45E89BB8072948B6826D\",\"deviceId\":\"DEV_3BEFFAFB61AC4D7681AD9A76C695C591\",\"version\":\"1\"}";

        String result = client.sendPostJson(requestUrl, jsonStr);
        log.info("最终返回结果：{}", result);
    }
}